import Vue from "vue"
import VueRouter from "vue-router"
Vue.use(VueRouter);
import {readToken,deleteToken} from "@/utils/auth"
import store from "@/store"


// 创建一个增强的方法
function enhance(source,type){
    //1. 备份 source.prototype[type]  方法
    const origin = source.prototype[type];
    // 2. 增强 push 方法
    source.prototype[type] = function(location,okCallback,errorCallback){
        if(okCallback || errorCallback){
            origin.call(this,location,okCallback,errorCallback);
        }else{
            origin.call(this,location).catch(()=>{});
        }
    }
}

//增强 VueRouter 的 push 方法
enhance(VueRouter,"push");
//增强 VueRouter 的 replace 方法
enhance(VueRouter,"replace");

import routes from "./routes"


let router = new VueRouter({
    mode:"history",
    routes,
    scrollBehavior (to, from, savedPosition) {  //滚动条行为
        // to : 即将要进入的路由对象
        // from : 现在要离开的路由对象
        // savedPosition:  保存的滚动条的位置【通过浏览器前进后退才会纪录位置】
        // console.log(to)
        // console.log(from)
        // console.log(savedPosition)  //  null

        if(savedPosition){
            return savedPosition;  //通过浏览器前进后退才会纪录位置，返回位置
        }else{
            return {x:0,y:0};  //正常编程式路由导航/ router-link  直接回到最顶部
        }

    }
})

// 需要登录【鉴权】的路由 数组
let isLoginArr = ["/trade","/pay","/paysuccess","/center"];

//全局前置路由守卫
router.beforeEach(async (to,from,next)=>{
    // to :  即将要进入的路由对象
    // from : 现在要离开的路由对象
    // next : 确认要进入的路由对象

    // console.log(to)
    // console.log(from)

    // 获取本地存储的token
    let token = readToken();
    //判断 是否存在token
    if(token){
        //存在token, 说明登录过，继续获取 vuex 中的 用户信息
        
        //获取用户信息
        let userInfo = store.state.user.userInfo;
        
        //判断是否在 vuex 获取到用户信息
        if(userInfo.id){
            //说明 存在 用户信息，直接放行。
            // console.log("说明 存在 用户信息，直接放行。")
            next();
        }else{
            //没获取到用户信息,【初次登录或刷新了浏览器】 通过 token 发送请求获取用户信息
            // console.log("没获取到用户信息,【初次登录或刷新了浏览器】 通过 token 发送请求获取用户信息");
            //调用store  方法 获取用户信息
            try {
                //token 有效，获取用户信息成功，将用户信息存入到vuex 中，然后放行
                await store.dispatch("user/getUserInfo");
                // console.log("token 有效，获取用户信息成功，将用户信息存入到vuex 中，然后放行")
                next();

            } catch (error) {
                //token 过期，获取用户信息失败，删除本地token，跳转至登录页面
                // console.log("token 过期，获取用户信息失败，删除本地token,跳转至登录页面")
                //删除token
                deleteToken();
                //跳转至登录
                next("/login");
            }
            

        }

    }else{
        //不存在token，说明没有登录，不能访问敏感路由，【支付、订单、交易】
        // console.log("不存在token，说明没有登录，不能访问敏感路由，【支付、订单、交易】")
       if(isLoginArr.includes(to.path)){
            next("/login");
       }else{
            next();
       }
       
       
       
    }




    next();

})


//暴露路由对象
export default router;